﻿using System;
using System.Threading;

// Добавить reference на библиотеку
using NQueueing;

namespace NQueueingTestApp
{
    class Program
    {
        // Имитация случайной задержки
        static Random rnd = new Random(DateTime.Now.Millisecond);
        static void RandomSleep(int min, int max)
        {
            Thread.Sleep(rnd.Next(min, max));
        }

        static void ProcessingOne(int item)
        {
            // Обработать здесь задачу item...
            // Обработка происходит в отдельном потоке.
            RandomSleep(10, 300); // Случайная задержка в обработке

            // Номер текущего потока, от 0 до (maxThreadsCount-1)
            string name = Thread.CurrentThread.Name;
            Console.WriteLine("{0} / Thread №: {1}", item, name);
        }

        static void Main(string[] args)
        {

            // Создадим Систему Массового Обслуживания состоящую
            // из 3-х потоков и очередью длины 10.
            IServerQueue<int> smo = new StandartServerQueue<int>(ProcessingOne, 10, 3);

            smo.Start(); // Запускаем процесс обработки

            // Добавим 15 задач в очередь
            for (int task = 0; task < 15; task++)
            {
                // Поставим задачу в очередь в текущем потоке
                EnqueueStatus result = smo.TryEnqueue(task);
  
                RandomSleep(10, 100); // Случайная задержка при добавлении
                Console.WriteLine("{0} / Enqueue: {1}", task, result);
                
            }

            smo.Close(); // Не забываем остановить

            Console.ReadKey();
        }
    }
}